#include <stdio.h>
#include <omp.h>  // 添加OpenMP头文件

int array_sum(int n, int *v) {
    int i;
    int res = 0;
    
    // 创建任务组并声明任务归约
    #pragma omp taskgroup task_reduction(+:res)
    {
        if (n > 0) {
            // 处理首元素任务
            #pragma omp task in_reduction(+:res)
            res += v[0];
            
            // 处理剩余元素任务循环
            #pragma omp taskloop in_reduction(+:res) nogroup
            for (i = 1; i < n; ++i) {
                res += v[i];
            }
        }
    }
    return res;
}

int main() {
    int n = 10;
    int v[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};  // 修正中文逗号
    
    // 并行执行区域
    #pragma omp parallel
    #pragma omp single  // 保证只生成一次任务
    {
        int res = array_sum(n, v);
        printf("The result is %d\n", res);
    }
    return 0;
}